全部例程

MCO - PA8从主频分频输出

W55MH32

更新于 2026年9月1日

本篇总结

使用 MCO,从 PA8 输出系统时钟分频信号。

🔑 KEIL MDK、UART调试、MCO

硬件平台:本例程基于 W55MH32L-EVB 开发板运行。

采购推荐:点击前往 WIZnet 官方淘宝店铺 选购 W55MH32L-EVB

本示例演示 MCO(Microcontroller Clock Output,微控制器时钟输出)功能,将内部时钟信号通过 PA8 引脚输出到外部,便于时钟测量、同步或为其他器件提供时钟源。W55MH32 的 MCO 支持输出 SYSCLK(系统时钟)、HSI(内部高速时钟)、HSE(外部高速时钟)以及 PLLCLK 的多种分频输出。本示例输出 PLL 时钟 16 分频信号(PLLCLK/16 = 4.5MHz)到 PA8,可通过示波器测量验证。

前置工具准备

开始本例程前,请确认以下工具已安装:

硬件连接

本例程使用 PA8 引脚输出时钟信号(MCO 功能)。用示波器探头连接 PA8 可测量输出时钟的频率和波形。USART1 用于输出调试信息。

引脚功能方向模式
PA8MCO(时钟输出)开发板 → 示波器复用推挽输出 (AF_PP)
PA9USART1_TX开发板 → PC复用推挽输出 (AF_PP)
PA10USART1_RXPC → 开发板浮空输入 (IN_FLOATING)

工程结构

工程位于 SDK 内 1.SDK\ModuleDemo\MCO\,核心文件如下:

MCO/
├── USER/
│   ├── main.c            ← MCO配置 + 时钟输出
│   ├── w55mh32_conf.h    ← 外设头文件集中包含
│   ├── w55mh32_it.c/h    ← 中断服务函数
│   ├── system_w55mh32.c/h← 系统初始化(时钟配置)
│   └── startup_w55mh32.s ← 启动文件
└── SYSTEM/
    └── delay/
        └── delay.c/h      ← SysTick 延时函数

步骤1:MCO 配置与时钟输出

文件:USER/main.c — 配置 PA8 为复用推挽输出(MCO_GpioConfig()),通过 RCC_ClkConfiguration() 配置 PLL(HSE×9 = 72MHz),再调用 RCC_MCOConfig(RCC_MCO_PLLCLK_Div16) 选择输出 PLL 16 分频(4.5MHz)。

void MCO_GpioConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /* PA8: MCO → 复用推挽输出 */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void RCC_ClkConfiguration(void)
{
    RCC_DeInit();

    RCC_HSEConfig(RCC_HSE_ON);
    while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);

    RCC_PLLCmd(DISABLE);
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* HSE 8MHz × 9 = 72MHz */

    RCC_PLLCmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    RCC_PCLK1Config(RCC_HCLK_Div2);
    RCC_PCLK2Config(RCC_HCLK_Div1);

    RCC_LSICmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
    RCC_HSICmd(ENABLE);
    while (RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);
}

int main(void)
{
    RCC_ClocksTypeDef clocks;

    delay_init();

    RCC_ClkConfiguration();

    UART_Configuration(115200);
    printf("MCO Out Pll Div Test.\n");
    RCC_GetClocksFreq(&clocks);

    printf("SYSCLK: %3.1fMhz, HCLK: %3.1fMhz, PCLK1: %3.1fMhz, PCLK2: %3.1fMhz, ADCCLK: %3.1fMhz\n",
           (float)clocks.SYSCLK_Frequency / 1000000, (float)clocks.HCLK_Frequency / 1000000,
           (float)clocks.PCLK1_Frequency / 1000000, (float)clocks.PCLK2_Frequency / 1000000, (float)clocks.ADCCLK_Frequency / 1000000);

    MCO_GpioConfig();
    RCC_MCOConfig(RCC_MCO_PLLCLK_Div16); /* PLL(72MHz) / 16 = 4.5MHz 输出到 PA8 */

    while (1);
}
  

MCO 配置只需两步:配置 PA8 为复用推挽输出(GPIO_Mode_AF_PP),调用 RCC_MCOConfig() 选择时钟源。PA8 是 MCO 的固定输出引脚,不可更改。本例使用 RCC_MCO_PLLCLK_Div16 输出 PLL 16 分频(72MHz/16 = 4.5MHz)。

如果你想自定义

  • 换时钟源 → 修改 RCC_MCOConfig() 参数:RCC_MCO_HSI(8MHz)、RCC_MCO_HSE(8MHz)、RCC_MCO_PLLCLK_Div2(36MHz)、RCC_MCO_PLLCLK_Div16(4.5MHz)
  • 为外部器件提供时钟 → 将 PA8 连接到外部芯片的时钟输入引脚,MCO 可作为外部器件的时钟源

运行验证

下载固件并按 RESET 后,PA8 引脚输出 PLL 16 分频时钟信号(4.5MHz)。使用示波器探头连接 PA8,可观察到方波时钟信号。串口打印系统时钟信息与 "MCO Out Pll Div Test." 提示信息。

示波器测量 PA8 引脚 MCO 输出波形:时钟信号频率与配置的时钟源一致

常见问题

Q: PA8 无时钟信号输出

确认 PA8 配置为复用推挽输出(GPIO_Mode_AF_PP)。检查 RCC_MCOConfig 参数是否正确。确认 GPIO 速度设置为 GPIO_Speed_50MHz。

Q: 示波器测量频率不正确

检查系统时钟配置,通过 RCC_GetClocksFreq 确认实际 SYSCLK 频率。确认 RCC_MCOConfig 参数与预期一致(本例为 RCC_MCO_PLLCLK_Div16,输出 4.5MHz)。

Q: MCO 是否可以输出到其他引脚

MCO 输出固定在 PA8 引脚,不可更改。如果需要其他引脚输出时钟,可使用定时器的 PWM 输出功能生成时钟信号。

总结

本文基于 W55MH32 的 MCO 功能实现了微控制器时钟输出:

  • MCO 输出:PA8 复用推挽输出,通过 RCC_MCOConfig() 选择时钟源
  • 支持输出 SYSCLK、HSI(8MHz)、HSE(8MHz) 以及 PLLCLK 的多种分频(Div2/Div16 等)时钟源
  • 可用于时钟测量验证、外部器件时钟源提供、系统时钟同步等场景
  • PA8 是 MCO 固定输出引脚,本例输出 PLLCLK/16(4.5MHz)

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5 配套开发板

Andy

W5500 技术支持专家